import { useDispatch, useSelector } from 'react-redux';
import { useCallback } from 'react';
import { showModal } from '../store/actions';
import { isBalanceSufficient } from '../pages/send/send.utils';
import {
  getHexGasTotal,
  increaseLastGasPrice,
} from '../helpers/utils/confirm-tx.util';
import { getConversionRate, getSelectedAccount } from '../selectors';

/**
 * Determine whether a transaction can be cancelled and provide a method to
 * kick off the process of cancellation.
 *
 * Provides a reusable hook that, given a transactionGroup, will return
 * whether or not the account has enough funds to cover the gas cancellation
 * fee, and a method for beginning the cancellation process
 * @param {Object} transactionGroup
 * @return {[boolean, Function]}
 */
export function useCancelTransaction(transactionGroup) {
  const { primaryTransaction, initialTransaction } = transactionGroup;
  const gasPrice = primaryTransaction.txParams?.gasPrice?.startsWith('-')
    ? '0x0'
    : primaryTransaction.txParams?.gasPrice;
  const { id } = initialTransaction;
  const dispatch = useDispatch();
  const selectedAccount = useSelector(getSelectedAccount);
  const conversionRate = useSelector(getConversionRate);
  const cancelTransaction = useCallback(
    (event) => {
      event.stopPropagation();

      return dispatch(
        showModal({
          name: 'CANCEL_TRANSACTION',
          transactionId: id,
          originalGasPrice: gasPrice,
        }),
      );
    },
    [dispatch, id, gasPrice],
  );

  const hasEnoughCancelGas =
    primaryTransaction.txParams &&
    isBalanceSufficient({
      amount: '0x0',
      gasTotal: getHexGasTotal({
        gasPrice: increaseLastGasPrice(gasPrice),
        gasLimit: primaryTransaction.txParams.gas,
      }),
      balance: selectedAccount.balance,
      conversionRate,
    });

  return [hasEnoughCancelGas, cancelTransaction];
}
